#ifndef SYSTEM_STATE_H
#define SYSTEM_STATE_H

#include"State.h"

class System;

class Intro : public State<System>
{
private:
	//Set assign and constructor private
	Intro(){}	
	Intro(const Intro&);
	Intro& operator=(const Intro&);
public:
	static Intro* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class MainMenu : public State<System>
{
private:
	//Set assign and constructor private
	MainMenu(){}	
	MainMenu(const MainMenu&);
	MainMenu& operator=(const MainMenu&);
public:
	static MainMenu* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class NewGame : public State<System>
{
private:
	NewGame(){}
	NewGame(const NewGame&);
	NewGame& operator=(const NewGame&);
public:
	static NewGame* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class ContinueGame : public State<System>
{
private:
	ContinueGame(){}
	ContinueGame(const ContinueGame&);
	ContinueGame& operator=(const ContinueGame&);
public:
	static ContinueGame* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class Setting : public State<System>
{
private:
	Setting(){}
	Setting(const Setting&);
	Setting& operator=(const Setting&);
public:
	static Setting* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class ExitGame : public State<System>
{
private:
	ExitGame(){}
	ExitGame(const ExitGame&);
	ExitGame& operator=(const ExitGame&);
public:
	static ExitGame* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class SelectMap : public State<System>
{
private:
	SelectMap(){}
	SelectMap(const SelectMap&);
	SelectMap& operator=(const SelectMap&);
public:
	static SelectMap* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class Running : public State<System>
{
private:
	Running(){}
	Running(const Running&);
	Running& operator=(const Running&);
public:
	static Running* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class PauseMenu : public State<System>
{
private:
	PauseMenu(){}
	PauseMenu(const PauseMenu&);
	PauseMenu& operator=(const PauseMenu&);
public:
	static PauseMenu* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

class ScoreBoard : public State<System>
{
private:
	ScoreBoard(){}
	ScoreBoard(const ScoreBoard&);
	ScoreBoard& operator=(const ScoreBoard&);
public:
	static ScoreBoard* Instance();
	virtual void Enter(System*);
	virtual void Execute(System*);
	virtual void Exit(System*);
	virtual bool OnMessage(System*, const Telegram&){return false;}
};

#endif